package com.inspectortime.domain.pricing;

import java.util.List;

import com.inspectortime.common.Identifiable;
import com.inspectortime.domain.Inspection;
import com.inspectortime.domain.InspectorCompany;
import com.inspectortime.domain.type.FoundationType;
import com.inspectortime.domain.type.PropertyType;

/**
 * Calculates the inspection fee for a given inspection. Note that this
 * interface does not assume a base fee. If a base fee is needed then
 * implementor must provide.
 * 
 * @author mKvalsvik
 * 
 */
public interface FeeCalculator extends Identifiable {

	double calculateFee(Inspection inspection);
	
	double getBaseFee();
	
	FoundationType getFoundationType();
	
	float getMaxListedPrice();
	int getMaxNumberOfAcUnits();
	
	float getMaxNumberOfBathrooms();
	
	int getMaxNumberOfBedrooms();
	
	int getMaxNumberOfStories();

	double getMaxSquareFeet();
	
	float getMinListedPrice();
	int getMinNumberOfAcUnits();
	float getMinNumberOfBathrooms();
	int getMinNumberOfBedrooms();
	int getMinNumberOfStories();
	double getMinSquareFeet();
	PropertyType getPropertyType();
	
	int getSequentialId();
	public String getSource();
	String[] getSupportedZipCodeArray();
	List<String> getSupportedZipCodeList();
	String getSupportedZipCodes();
	boolean hasSupportedZipCodes();
	boolean isSupportedZip(String zipCode);
	
	boolean isSupportedZip(String[] zipsToCheckAgainst);
	/**
	 * Finds other fee calculators for the company that this calculator belongs to
	 * @return
	 */
	List<FeeCalculator> otherFeeCalculatorsForCompany();
	void setInspectorCompany(InspectorCompany inspectorCompany);
	void setSequentialId(int n);
	boolean supports(Inspection inspection);
}

